A look at residental real estate listing and sales, according to monthly reports from Zillow.
import pandas as pd
import numpy as np
import altair as alt
from datetime import datetime
today = datetime.today()
def doChart(metric='Metro_Listings_PriceCut_SeasAdj_AllHomes', location='United States', unit='%', zero=True, yoy=False, color='navy'):
url = 'https://files.zillowstatic.com/research/public/Metro/{}.csv'.format(metric)
df_raw = pd.read_csv(url, encoding = "ISO-8859-1")
months = df_raw.columns.to_list()[3:]
df_tmp = df_raw.set_index('RegionName')[months].T.reset_index()
print('Most recent data: {}'.format(months[-1]))
if yoy:
df_yoy = df_tmp[['index', location]].sort_values('index').copy()
df_yoy = df_yoy.set_index('index')
df_yoy['Change'] = df_yoy[location].apply(lambda v: v if isinstance(v, float) else np.nan).pct_change(12).apply(lambda v: 100 * v)
df_yoy = df_yoy.dropna()
#print(df_yoy.tail(20))
return alt.Chart(df_yoy.reset_index()).mark_bar(color=color).encode(
alt.X('index:T', axis=alt.Axis(title='', format="%b-%y")),
alt.Y('Change:Q', axis=alt.Axis(title=metric.replace('_', ' ') + " [{}]".format(unit))),
color=alt.condition(f"datum['Change'] < 0",
alt.value('tomato'),
alt.value(color)
),
tooltip=[alt.Tooltip('Change:Q', format=',.02f'), alt.Tooltip('index:T', format='%B %Y')]
).properties(
title="Zillow {} ({}) YoY Growth over time".format(metric.replace('_', ' '), location),
width=750,
height=450,
background='white'
)
else:
return alt.Chart(df_tmp).mark_line(color=color).encode(
alt.X('index:T', axis=alt.Axis(title='', format="%b-%y")),
alt.Y('{}:Q'.format(location),
scale=alt.Scale(zero=zero),
axis=alt.Axis(title=metric.replace('_', ' ') + " [{}]".format(unit))),
tooltip=[alt.Tooltip('{}:Q'.format(location), format=',.02f'),
alt.Tooltip('index:T', format='%B %Y')]
).properties(
title="Zillow {} ({}) over time".format(metric.replace('_', ' '), location),
width=750,
height=450,
background='white'
)
doChart(metric='Metro_Listings_PriceCut_SeasAdj_AllHomes', location='United States')
c = doChart(metric='Sale_Counts_Msa', location='United States', unit='YoY % Growth', yoy=True, color='teal')
c.save('residential-realestate-zillow.png')
c.display()
doChart(metric='Sale_Counts_Msa', location='Denver, CO', unit='YoY % Growth', yoy=True)
doChart(metric='Metro_Listings_PriceCut_SeasAdj_AllHomes', location='Denver, CO')
doChart(metric='NewMonthlyListings_SSA_AllHomes_Metro', location='Chicago, IL', unit='# of homes')
doChart(metric='MedianAgeOfInventory_NSA_AllHomes_Metro', location='United States', unit='days')
doChart(metric='MedianAgeOfInventory_NSA_AllHomes_Metro', location='Dallas-Fort Worth, TX', unit='days')
doChart(metric='MedianAgeOfInventory_NSA_AllHomes_Metro', location='Denver, CO', unit='days')
doChart(metric='MedianAgeOfInventory_NSA_AllHomes_Metro', location='United States', unit='days')
doChart(metric='MonthlyListings_SSA_AllHomes_Metro', location='United States', unit='# of homes')
doChart(metric='SalesPrevForeclosed_Share_Msa', location='United States')
doChart(metric='SalesPrevForeclosed_Share_Msa', location='Denver, CO')
doChart(metric='MedianAgeOfInventory_NSA_AllHomes_Metro', location='Denver, CO', unit='days')
doChart(metric='Sale_Counts_Msa', location='Denver, CO', unit='# of homes')
doChart(metric='Metro_Zri_SingleFamilyResidenceRental', location='Denver, CO', unit='$ / month')
doChart(metric='Metro_Zri_SingleFamilyResidenceRental', location='United States', unit='$ / month', zero=False)
Exported from analysis/residential-realestate-zillow.ipynb committed by GitHub Action on Sat Oct 24 01:09:00 2020 revision 2, ea11661